现代软件越来越大、越来越慢、越来越烂!还有救吗?
最近不少人吐槽软件行业发展得令人感到沮丧:一个没有应用程序的 Android 系统占用将近 6 GB,随随便便一个应用程序就好几百 MB;网页上打开一个“中等”规模大小的邮件需要花费 13 秒,手机开机需要 30 到 60 秒;网络应用程序也在源源不断的“随机”JS 错误......
如今的应用程序正变得越来越大、越来越慢、越来越差,可从整体时代趋势看,强大的硬件应该能引导我们写出更快、更小、更健壮的软件才对。1996 年诞生的《毁灭战士》能够运行在无数意想不到的设备上,甚至智能验孕棒的小屏幕都足以将其容纳;相比之下,2022 年的聊天应用在后台运行时往往要占用 0.5 GB(甚至更多)内存,即使是高端手机也深受所累。
从这些吐槽内容来看,80% 的批评算是公道有理,20% 则有点吹毛求疵。或者换句话说说:
区区一个“操作系统”,怎么就占了 30 MB?
大多数开发人员都知道,手机操作系统这东西开发起来难度极高,也不会问出“三十年前的电子表格应用才 10 KB,现在的 Factorio 怎么就上 GB 了?”这种傻话。如果不亲身参与开发,任何人都根本无法准确估计其中包含的难度和复杂性。
当然,这也不是说我们外人就不能提出批评。现在的应用程序确实比以前更慢,而且在体量呈指数增长的同时、价值回报并没有同步改善。至少大家肯定会认同一点:现代应用程序普遍存在巨大的优化空间。我们完全能让它更快,甚至快上几个数量级;我们可以精简代码;可以编写更小的专用库;可以找到新的资产压缩方法。
但我们为什么没这么做?
有人认为,“软件工程师在工作中已经丧失了成就感”。这话有一定道理,但我始终坚信,人在工作中其实天然是想把事做好的,只有反复失败之后才会最终放弃理想。所以,与其把软件的缓慢和 bug 归咎于惰性,我更想问“是怎样的普遍状况与具体措施,导致软件工程师们得不到良好的工作环境?”
我个人整理了几个答案。
在工程师眼中,软件应该是由交互组件、输入和输出共同构成的网络。没错,这个模型准确而且实用性极强。然而企业并不管那一套,他们更愿意用打包、宣传和销售的方式来界定软件形态。对商务人士和客户来说,软件就是一连串功能,别整那些虚的。
以库存管理应用程序为例,相关宣传材料中往往包含几张精美的库存照片、艳丽的本色再加上震撼人心的宣传语:
跨仓库跟踪库存
与 Delivery Pro、Supply Chain Plus 及 Super Point-of-Sale 等系统相集成
多层次按周 / 按月报告
细粒度访问与安全控制
跨所有终端即时更新
支持 Windows、MacOS 及 Linux 系统
这些都是可以明确证伪的表述:软件产品要么做得到,要么做不到,只需要一个小时的产品演示就能确切证明。而且其中只有一条跟速度有关,就是“即时更新”——这款软件可能速度很慢,点下按钮后可能要几秒钟才能有所响应。但无所谓,并不至于推翻“即时更新”的论断。
没错,速度确实会影响用户对于应用程序的整体体验,也是质量评估中的一项重要标志。但我们很难单把速度作为卖点。如果我们这边投入时间优化核心流程,但竞争对手却把资源用于开发新型报告,那大多数客户肯定会毫不犹豫地选择对方。所以,只要软件速度不是慢到无法正常使用,那开发者优先该做的永远是开展客户调查,预测哪些新功能对他们更有吸引力。可以想见,任何真正拥有掌控权的董事会,都绝不会允许公司在产品路线图中抽出半年时间专门处理技术债务。于是,落在开发者身上的重担永远是构建新功能、更多新功能……
程序员们当然想开发速度更快的应用程序,但市场并不在乎。
细心的朋友可能发现,产品宣传中根本没提“可靠性”这回事。但我们还是转换到营销的立场来分析:可靠性该怎么宣传?说完全无 bug 吗?这根本就不可能,而且也没法在产品演示中证明。“90% 的单元测试覆盖率和完整集成测试?”客户不懂也不关心。总而言之,我们没办法以客户既易懂又关心的方式来表现可靠性优势。敏捷理念告诉他们 bug 是不可避免的,只要软件供应商能持续修复就行。而且由于没有全面的方法来衡量软件缺陷(毕竟如果能发现,那我们不可能放着不修),我们自然没法把可靠性当成能跟竞争对手直接比较的指标。于是事情就成了现在这样:你可以投入时间做测试、重构和改进,但客户很可能完全没注意到。
这是个只有程序员关心软件 bug 的市场。
磁盘空间用量也不重要,只会偶尔用对比度很低的小字体显示在“下载”按钮旁边。而且这项指标在客户心目中的意义甚至还比不上可靠性或者速度。大家还记得上一次业务计算机磁盘空间不足是什么时候吗(注意,是办公设备,不是自己的个人电脑)?或者说,你会根据下载数据量来挑选要买哪款游戏吗?恐怕永远不会。确实,有些配置捉急的玩家会抱怨最新一代《使命召唤》太大了,但这款游戏还是在上线首周就狂收 10 亿美元。
给可执行文件或者输出包瘦身,着实是个费力又不讨好的活儿。而且这还是项技术性很强的工作,不单要求我们熟悉所构建的应用程序,还得了解它所依赖的几百个底层库。另外,整个开发行业也充斥着“别重新发明轮子”的舆论导向,部分原因在于这是个明显的雷区。我们可能理解不了某行代码是干啥的,但它也许非常重要。目前智能手机领域有 0.01% 的客户在使用 Ubuntu 系统,如果随意删掉一行,很可能导致应用程序无法正常运行。也许这行代码是用来防止程序在四年一次的闰日时意外崩溃的,也可能是条本身普普通通、但却被其他重要功能所依赖的函数。反正能不动就别动。
于是乎,帮应用程序瘦身同样成了程序员这边的一厢情愿,市场不在乎。
其实应用程序的分发并不难,有网基本就能实现。但销售应用程序可就困难无比了,毕竟人们愿意花 15 刀买个三明治或者电影票,但往往不想花 1 美元购买自己感兴趣的应用程序。真正愿意稳定为优质软件付费的只有两拨人:企业雇员,还有电子游戏玩家。不知道怎么回事,我们这个世界忽忽悠悠就走进了软件免费时代。
这种不想花钱的心理预期,对消费应用程序的质量造成了巨大损害。一款应用程序的开发成本往往在 5 万到 50 万美元之间。如果不能直接作为商品出售,那就得靠其他方式收回成本。所以 Web 和本机应用程序才变得臃肿而缓慢:用户跟踪、广告、营销渠道、附加销售、订阅付费墙,还有负责保护这些机制的控制措施等。这一切原本不需要被纳入软件,如今却都成了重要的组成部分。没错,造成现状的当然有贪婪心态作祟,但更多时候只是开发者绝望求存的结果。最终造成的现状,就是网上很多最流行的网站只能算勉强能用。
我这里对软件系统的浪费和低效问题绝无夸大。开发者当然可以按自己的心理预期发布一款质量精良的应用程序,但往往发现几乎没人愿意下载尝试。如果把它转换成免费试用 / 订阅模式,下载量倒是能稳定在几百,但愿意付费的用户仍然少得可怜。于是,我们被迫在免费版中添加广告,破坏了 UI 设计师的良苦用心。之后你发现单次广告浏览的收益只有几厘钱,于是开始展示更多广告。用户一边在抱怨广告太多,但一边却神奇地坚持免费版本。我们开始提供应用内购选项,允许大家花钱关闭广告。用户还是抱怨,也还是不花钱。而一旦开始以号召性的提示鼓励用户付费免广告后,很多人只会选择删除应用。循环几次之后,我们的应用程序已经面目全非,仅剩下一个毫无设计和精巧可言的收入机器——它会在每个角落、每个页面用广告塞满用户的视野。但即使是这样,我们也还是没赚到多少钱,开发者和用户双输。
如果人们愿意为应用付费,我们本可以消除这些问题。但大家不愿意,所以应用程序变得越来越大、越来越慢,也越来越差。
大家千万别以为我是在对着程序员开地图炮,这里我想细细分析软件开发者这个角色,看看能不能把事情做得更好。
即使是在经济衰退期间,软件开发者仍然拥有非凡的社会影响力。我们可以坚持使用或者不使用某种特定技术,也可以坚持争取高薪、福利和股权。我们只要稍微团结,就足以改变整个企业的文化和工作氛围。优秀的程序员不好找,我们知道,雇主也知道。
这就是我们掌握的力量,我们该用好这股力量。
我们应该在每轮冲刺中,留点时间解决技术债务。面对每个有望优化和改进代码的机会,我们都该紧紧抓住、甚至用一定的功能开发时间来换。我们应该说服企业雇主赞助开源项目,也必须普及一种正确的预期:程序员,不一定会按上头要求的方式做开发。我们有自己的从业准则,也有自己的行业规划与发展愿景。
这些作法其实不大会招惹麻烦。毕竟我们要求的并不多,各个行业都有超越具体要求的专业标准和规定。同样是工程,咱们软件工程怎么就那么好说话?
但必须承认,这些措施会让我们自己吸引一部分火力,这将是场艰苦的斗争。有些项目经理就是不愿意我们把时间,“浪费”在他们不理解的事情上。有些销售人员会担心我们的软件缺乏竞争力,投资者可能威胁把这份工作外包给更听话的承包商。客户态度和市场观念的转变还需要一段时间。但只要改变现代软件状态本身有价值,那就值得为之付出努力。
说实话,我个人并不乐观。90 年代,程序员所开发的是小巧且高度优化的应用程序,因为那时候的硬件太弱,大家别无选择。客户用的就是 32 MB 内存加 200 MHz 单核处理器,如果应用程序做不到尽可能精简,那压根就跑不起来。如今,两年前的基础款 Macbook Air 都有 250 倍于当初的内存容量,四核处理器也堪称当年人们无法想象的黑科技。现在灵活空间更大了,所以绝大多数应用程序写完之后直接就交付了,根本不做后期优化。只要没人抱怨,那就一切照此办理。举个例子,大家可以想想咱们日常使用的网络浏览器有多臃肿:这里囊括有消息收发、笔记记录甚至是代码编辑器。
过去二十年,整个行业都在努力让软件开发更快、更简单、更安全。没错,我们正以前所未有的速度产出新应用,功能丰富度也远超以往,同时吸引到更多缺乏相关知识的人们加入到开发工作中来。这确实有着强大的商业吸引力,但我们也正在为这股盲目跃进付出代价——每位客户、每度电乃至整个地球,都在分摊这份代价。
事情不会突然改变,甚至在未来五年内都不一定能有什么变化。但我们应该永远怀揣希望。
最新一波 Web 编程语言和技术(WASM、ESBuild、SWC、Bun 和 Yew 等)正将编译时和运行时的速度与可靠性推向新的高度。Rust 既保持 C 级别的性能,又具备高级语言式的开发友好性,因此在 Web 服务器领域备受瞩目。Tauri 这类轻量化 Electron 替代方案,有望成为 Web 开发工作中的首选跨平台框架。至于 Tree-shaking,这就是我们所长久期待的编译器与打包器。
在市场这边,多款流行电子游戏已经开始以买断制形式登陆移动平台。虽然还有很多工作要做,但这些进展中都蕴藏着希望,也许能让手机用户这个全球最大的技术消费群体深刻理解软件开发的成本。
如果说,过去二十年的主要目标是提高开发生产力,甚至为此牺牲效率和财务可持续性也在所不惜;那么接下来的二十年,我们的核心任务就是解决集体技术债务、重拾效率并改善经济形态。这是我们需要补的课、需要还的债,也是保持软件行业健康发展的唯一出路。
原文链接:
https://stackoverflow.blog/2023/01/30/is-software-getting-worse/
指导了上百万程序员,《代码大全》之父和你聊聊软件开发素养|独家探访“编程圣经”背后故事
为谷歌工作 16 年被当“垃圾”无情辞退,数千网友留言:为公司“卖命”不值得
2023 年第一场大数据相关的技术盛会来了!
2 月 6 日 9:30,聚焦 QCon 全球软件开发大会【现代数据栈建设及思考】解决方案专场!来自滴普科技、伊克罗德的技术大咖,将围绕湖仓一体架构、智能湖仓等话题进行分享。
扫码或点击【阅读原文】,立即报名,与一众开发者朋友共同学习、交流!